home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル実用編 / チャート / CHFILE.C < prev    next >
Text File  |  1994-03-10  |  6KB  |  179 lines

  1. /******************************************************************************
  2.  *    chfile.c:    ファイルのロード処理関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <doslib.h>
  9. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  10. #include <task.h>        /* タスクマンを利用するときに必要    */
  11. #include "chart.h"        /* このプログラム固有のヘッダファイル    */
  12. #include "csfile.h"        /* 小遣い帳データファイルのヘッダファイル */
  13.  
  14. /******************************************************************************
  15.  *    loadFile():    指定の日付のデータをファイルから読み込む
  16.  ******************************************************************************
  17.  *    引数:    ComVal *pcv    共通変数へのポインタ
  18.  *        int month    月
  19.  *        int day        日
  20.  *        int *tMoney    金額を格納するポインタ
  21.  *    戻り値:    BOOLEAN        = TRUE:  読み込み成功
  22.  *                = FALSE: 読み込み失敗
  23.  */
  24. BOOLEAN loadFile(ComVal *pcv, int month, int day, int *tMoney)
  25. {
  26.     int i, errCode, len;
  27.     short sp;
  28.     short index[512];        /* データの位置テーブル        */
  29.     FILE *hFile;            /* ファイルハンドル        */
  30.     KZDATA kzBuff;            /* ファイル1レコードバッファ    */
  31.  
  32.     /* ドライブを読み込みモードでチェック */
  33.     errCode = checkDrive(pcv->fileName, 1);
  34.     if (errCode < 0) {
  35.         if (errCode == -4)
  36.             /* ファイルが見付からない場合 */
  37.             DMError(D_CONFIRM, "データファイルが見付かりません。");
  38.         return FALSE;        /* 読み込みが行えない場合 */
  39.     }
  40.     /* ファイルをオープンする */
  41.     hFile = fopen(pcv->fileName, "rb");
  42.     if (hFile == NULL) {
  43.         /* ファイルがオープンできない */
  44.         for (i = 0; i < 7; i++)
  45.             tMoney[i] = 0;
  46.         DMError(D_CONFIRM, "ファイルがオープンできません。");
  47.         return FALSE;
  48.     }
  49.     fseek(hFile, 0,SEEK_SET);
  50.     len = fread(index, sizeof(short), 512, hFile);
  51.     if (len != 512) {
  52.         DMError(D_CONFIRM, "データファイルの構造が異常です。");
  53.         fclose(hFile);
  54.         return FALSE;
  55.     }
  56.     /* 指定の日付までのシーク位置を求める */
  57.     sp = index[(month - 1) * 32 + (day - 1)];
  58.     if (sp == -1) {
  59.         /* データ新規作成 */
  60.         for (i = 0; i < 7; i++)
  61.             tMoney[i] = 0;
  62.         fclose(hFile);
  63.         return TRUE;
  64.     }
  65.     sp *= sizeof(KZDATA);
  66.     if (fseek(hFile, sp + 1024, SEEK_SET)) {
  67.         /* データ位置までシークできない */
  68.         DMError(D_CONFIRM, "データファイルの構造が異常です。");
  69.         fclose(hFile);
  70.         return FALSE;
  71.     }
  72.     /* データの読み込み */
  73.     len = fread((unsigned char *) &kzBuff, sizeof(KZDATA), 1, hFile);
  74.     if (len != 1) {
  75.         /* 読み込みエラーの場合 */
  76.         DMError(D_CONFIRM, "ファイルの読み込みに失敗しました。");
  77.         for (i = 0; i < 7; i++)
  78.             tMoney[i] = 0;
  79.         fclose(hFile);
  80.         return FALSE;
  81.     }
  82.     /* バッファ内のデータをデュープする */
  83.     for (i = 0; i < 7; i++)
  84.         tMoney[i] = kzBuff.money[i];
  85.  
  86.     /* ファイルをクローズする */
  87.     fclose(hFile);
  88.     return TRUE;
  89. }
  90.  
  91. /******************************************************************************
  92.  *    readTable():    データファイル内の位置テーブルを読み出す
  93.  ******************************************************************************
  94.  *    引数:    ComVal *pcv    共通変数へのポインタ
  95.  *    戻り値:    BOOLEAN        = TRUE:  読み込み成功
  96.  *                = FALSE: 読み込み失敗
  97.  *    注釈:
  98.  *    小遣い帳データの配置情報のテーブルをデータファイルより読み出します。
  99.  */
  100. BOOLEAN readTable(ComVal *pcv, short *index)
  101. {
  102.     int errCode, len;
  103.     FILE *hFile;
  104.  
  105.     /* ドライブを読み込みモードでチェック */
  106.     errCode = checkDrive(pcv->fileName, 1);
  107.     if (errCode < 0) {
  108.         if (errCode == -4)
  109.             DMError(D_CONFIRM, "データファイルが存在しません。");
  110.         return FALSE;        /* 読み込みが行えない場合 */
  111.     }
  112.     /* ファイルをオープンする */
  113.     hFile = fopen(pcv->fileName, "rb");
  114.     if (hFile == NULL) {
  115.         /* ファイルがオープンできない */
  116.         DMError(D_CONFIRM, "ファイルがオープンできません。");
  117.         return FALSE;
  118.     }
  119.     len = fread(index, sizeof(short), 512, hFile);
  120.     if (len != 512) {
  121.         DMError(D_CONFIRM, "データファイルの構造が異常です。");
  122.         fclose(hFile);
  123.         return FALSE;
  124.     }
  125.  
  126.     fclose(hFile);
  127.     return TRUE;
  128. }
  129.  
  130. /******************************************************************************
  131.  *    checkDrive():    指定ファイル名のドライブをチェック
  132.  ******************************************************************************
  133.  *    引数:    char *fname    ファイル名へのポインタ
  134.  *        int mode    検査するモード
  135.  *                =  0: 書き込み
  136.  *                =  1: 読み込み
  137.  *    戻り値:    int        >= 0: 読み込み成功
  138.  *                = -1: ファイル名が正しくない
  139.  *                = -2: ドライブの準備ができていない
  140.  *                = -3: 書き込み禁止がされている
  141.  *                = -4: ファイルが存在しない
  142.  */
  143. int checkDrive(char *fname, int mode)
  144. {
  145.     int stat, errCode;
  146.     struct NAMECKBUF nminf;
  147.     char filbuf[TS_NAMEMAX];
  148.  
  149.     /* 入力されたファイル名を分解・検査 */
  150.     stat = NAMECK((unsigned char *) fname, &nminf);
  151.     if (stat != 0) {
  152.         DMError(D_CONFIRM, "ファイル名が正しくありません。");
  153.         return -1;
  154.     }
  155.     /* フルパス名を作成する */
  156.     strmfn(fname, (char *) nminf.drive, (char *) nminf.path, (char *) nminf.name, (char *) nminf.ext);
  157.  
  158.     /* 指定ファイル名のドライブの状態を取得する */
  159.     stat = TSDrvctrl(0, nminf.drive[0] & 0x1f);
  160.     /* ドライブが準備されているかをチェックする */
  161.     if ((stat & 0x06) != 0x02) {
  162.         DMError(D_CONFIRM, "ドライブの準備ができていません。");
  163.         return -2;
  164.     }
  165.     /* プロテクトされているかどうかをチェックする */
  166.     if (mode == 0 && (stat & 0x0a) == 0x0a) {
  167.         DMError(D_CONFIRM, "ライトプロテクトされています。\r"
  168.                    "書き込みを行うことができません。");
  169.         return -3;
  170.     }
  171.     /* ファイルの存在のチェック */
  172.     errCode = TSFiles(filbuf, fname, TS_ARCH);
  173.     if (errCode < 0)
  174.         /* ファイルの新規作成をする場合を考えて、エラーダイアログは出さない */
  175.         return -4;
  176.  
  177.     return 0;
  178. }
  179.